using System;
using System.Collections.Generic;

namespace SIP.PN.Modelo.Entidades
{
    public abstract class Asignacion
    {
        private int codigo;
        private ProyectoTarea tarea;
        private OperarioEspecialidad operarioEspecialidad;
        private DateTime fechaAsignacion;
        private IList<EvaluacionOperario> evaluaciones = new List<EvaluacionOperario>();

        public virtual int Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        public virtual ProyectoTarea Tarea
        {
            get { return tarea; }
            set { tarea = value; }
        }

        public virtual OperarioEspecialidad OperarioEspecialidad
        {
            get { return operarioEspecialidad; }
            set { operarioEspecialidad = value; }
        }

        public virtual DateTime FechaAsignacion
        {
            get { return fechaAsignacion; }
            set { fechaAsignacion = value; }
        }

        public virtual IList<EvaluacionOperario> Evaluaciones
        {
            get { return evaluaciones; }
            set { evaluaciones = value; }
        }

        #region Evaluacion

        public virtual EvaluacionOperario Evaluacion
        {
            get
            {
                if (evaluaciones != null && evaluaciones.Count > 0)
                    return evaluaciones[0];
                return null;
            }
            set
            {
                if (evaluaciones == null)
                    evaluaciones = new List<EvaluacionOperario>();
                if (evaluaciones.Count > 0)
                    evaluaciones[0] = value;
                else
                    evaluaciones.Add(value);
            }
        }

        public virtual EvaluacionOperario CrearEvaluacion()
        {
            Evaluacion = new EvaluacionOperario(this);
            Evaluacion.Conceptos = new List<EvaluacionConcepto>();
            Evaluacion.FechaEvaluacion = DateTime.Now;
            return Evaluacion;
        }

        public virtual bool EvaluacionCompleta
        {
            get { return Evaluacion != null; }
        }

        public virtual int CalcularEvaluacionFinal()
        {
            if (!EvaluacionCompleta)
                return 0;
            if (Tarea.Evaluacion == null)
                return 0;
            int c = (2 * Evaluacion.PuntajePromedio) + (Tarea.Evaluacion.PuntajePromedio);
            int r = Math.DivRem(c, 3, out r);
            return r;
        }

        #endregion

        #region Metodos Sobreescritos

        public override bool Equals(object obj)
        {
            Asignacion otro = obj as Asignacion;
            if (otro == null)
                return false;
            return Codigo.Equals(otro.Codigo);
        }

        public override int GetHashCode()
        {
            return string.Format("{0}-{1}", GetType(), ToString()).GetHashCode();
        }

        public override string ToString()
        {
            return Codigo.ToString();
        }

        #endregion
    }
}